//============================================================================
// Name        : Main.cpp
// Author      : O.M.A.V.
// Description : De hoofdklasse van de server applicatie
//============================================================================

// Includes
#include <iostream>
#include <string>
#include <sstream>
#include <stdio.h>
#include "classes/hostinfo/hostinfo.h"
#include "classes/connection/connection.h"

// Namespaces
using namespace std;

// Function prototypes
void getInput();
void getPortNr(int argc, char *argv[]);
void checkPort(int portNr);

// Fields
string input;
int port;
Connection *server;

/*
 * Application entrypoint.
 */
int main(int argc, char *argv[])
{
	// Haal poort nummer op
	getPortNr(argc, argv);

	// Start server wanneer port bekend is
	if(port != 0)
	{
		cout << endl << "IP adres: " << HostInfo::IPAddressToChar(HostInfo::GetLocalIPAddress("eth0")) << endl;
		cout << "Poort: " << port << endl << endl;

		server = new Connection(port);
	}
	return 0;
}

/*
 * Process arguments or prompt for port number.
 */
void getPortNr(int argc, char *argv[])
{
	// Geen argumenten opgegeven
	if(argc != 2)
	{
		cout << "Geen poort opgegeven. Geef een poortnummer op." << endl;

		getInput();
	}
	// Wel argumenten opgegeven
	else
	{
		// indien er letters na nummers ingevoerd, zullen de letters worden genegeerd
		std::istringstream iss(argv[1]);

		int port;

		// Invoer is wel een getal
		if(iss >> port)
		{
			checkPort(port);
		}
		// Invoer is geen getal
		else
		{
			cout << "Poortnummer is niet numeriek. Geef een poortnummer op." << endl;

			getInput();
		}
	}
}

/*
 * Prompt for port number.
 */
void getInput()
{
	cout << "Poort nummer: ";
	cin >> input;

	// indien er letters na nummers ingevoerd, zullen de letters worden genegeerd
	std::istringstream iss(input);

	int port;

	// Invoer is wel een getal
	if(iss >> port)
	{
		checkPort(port);
	}
	// Invoer is geen getal
	else
	{
		cout << "Invoer is niet numeriek. Geef een poortnummer op." << endl;
		getInput();
	}
}

/*
 * Check if a port number is valid.
 */
void checkPort(int portNr)
{
	// Input is correct
	if(portNr < 65535 && portNr > 0)
	{
		port = portNr;
	}
	// Invoer is niet correct
	else
	{
		cout << "Geef een numerieke waarde tussen 0 en 65536 op." << endl;
		getInput();
	}
}
